/**
 * @fileoverview 易学基本常量库。
 *
 * @author 周培公 peigong@foxmail.com QQ:377650913
 * @version 1.0
 */
(function(){
	var PI = Math.PI,
		 sin = Math.sin,
		 round = Math.round;
		 
	var E2 = _getE2(),
		 E5 = _getE5(),
		 E10 = _getE10(),
		 E12 = _getE12(),
		 E60 = _getE60(),
		 V10 = _getV10(),
		 V12 = _getV12(),
		 E10Position = _getE10Position();
 	var ea = easiness = window.easiness = window.easiness || {
		/**
		 * 阴阳常量。
		 */
		E2 : E2,
		
		/**
		 * 五行常量。
		 */
		E5 : E5,
		
		/**
		 * 十天干常量。
		 */
		E10 : E10,
		
		/**
		 * 十二地支常量。
		 */
		E12 : E12,
		
		/**
		 * 六十花甲常量。
		 */
		E60 : E60,
		
		/**
		 * 十神常量。
		 */
		V10 : V10,
		
		/**
		 * 十干生旺死绝表常量。
		 */
		V12 : V12,
		
		/**
		 * 十神位置权重。
		 */
		E10Position : E10Position,
		
		/*
		 * 易学干支纪时对象。
		 */
		ETime : {
			year : E60[0],
			month : E60[0],
			day : E60[0],
			hour : E60[0]
		},
	
		/**
		 * 用神忌神类型枚举。
		 */
		UsefulPartyType : {
			None : -1, //未定义
			Useful : 1,//用神
			Harmful : 2,//忌神
			VirtualUseful : 3,//虚用
			VirtualHarmful : 4//虚忌
		},
		
		/**
		 * 日干旺衰指数类型枚举。
		 */
		DayIndexType : {
			None : -1, //未定义
			MorePowerful : 1,//极强
			Powerful : 2,//强
			Weak : 3,//弱
			MoreWeak : 4//极弱
		},
		
		/**
		 * 将干支纪时对象转换为字符串表示。
		 *
		 * @param {ETime} _eTime 干支纪时对象。
		 * @return 字符串表示。
		 */
		eTime2String : function(_eTime)
		{
			var result = "";
			result += _eTime.year.trunk.cn;
			result += _eTime.year.branch.cn;
			result += _eTime.month.trunk.cn;
			result += _eTime.month.branch.cn;
			result += _eTime.day.trunk.cn;
			result += _eTime.day.branch.cn;
			result += _eTime.hour.trunk.cn;
			result += _eTime.hour.branch.cn;
			return result;
		},
		
		/**
		 * 根据天干索引和地支索引，返回花甲的索引。
		 *
		 * @param {Integer} _tIdx 天干索引。
		 * @param {Integer} _bIdx 地支索引。
		 * @return 花甲的索引。
		 */
		getE60Index : function(_tIdx, _bIdx)
		{
			if((-1 == _tIdx) || (-1 == _bIdx))
			{
				alert("天干地支的索引不能为－1！");
			}
			else
			{
				for(var i = 0; i < 60; i++)
				{
					var e60 = E60[i];
					if((_tIdx == e60.trunk.idx) && (_bIdx == e60.branch.idx))
					{
						return e60.idx;
					}
				}
			}
			return -1;
		},
		
		/**
		 * 根据天干名返回天干索引。
		 *
		 * @param {String} _trunk 天干名称。
		 * @return 天干的索引。
		 */
		getE10Index : function(_trunk)
		{
			for(var i = 0; i < 10; i++)
			{
				var e10 = E10[i];
				if(_trunk == e10.cn)
				{
					return e10.idx;
				}
			}
			return -1;
		},
		
		/**
		 * 根据地支名返回地支索引。
		 *
		 * @param {String} _trunk 地支名称。
		 * @return 地支的索引。
		 */
		getE12Index : function(_branch)
		{
			for(var i = 0; i < 12; i++)
			{
				var e12 = E12[i];
				if(_branch == e12.cn)
				{
					return e12.idx;
				}
			}
			return -1;
		},
		
		/**
		 * 返回天干地支之间的作用值。
		 * @param {E} _eMe 自身。
		 * @param {E} _eOther 对方。
		 * @return  天干地支之间的作用值。
		 */
		getEV10Index : function(_eMe, _eOther)
		{
			var unit = 2*PI/5;
			var accuracy = 10000000000;
			var _v10_table = [[8,5,7,1,3],[9,4,6,0,2]];
			var row = -1, col = -1;
			if(_eMe.e2.idx == _eOther.e2.idx)
			{//同性
				row = 0;
			}
			else
			{//异性
				row = 1;
			}
			var angle = _eOther.e5.angle - _eMe.e5.angle;
			switch(round(sin(angle)*accuracy))
			{
				case round(sin(0)*accuracy):
					// 同我
					col = 0;
					break;
				case round(sin(unit)*accuracy):
					// 我生
					col = 1;
					break;
				case round(sin(-unit)*accuracy):
					// 生我
					col = 2;
					break;
				case round(sin(2*unit)*accuracy):
					// 我克
					col = 3;
					break;
				case round(sin(-2*unit)*accuracy):
					// 克我
					col = 4;
					break;
			}
			if((row < 0) || (col < 0))
			{
				alert("easiness.getEV10Index方法中索引异常。");
				return -1;
			}
			else
			{
				return _v10_table[row][col];
			}
		}
	};
	
	function _getE2()
	{//返回阴阳常量
		return [
			{ idx : 0, cn : "阴" },
			{ idx : 1, cn : "阳" }
		];
	};
	
	function _getE5()
	{//返回五行常量。
		var unit = 2*PI/5;
		return [
			{ idx : 0, cn : "水", angle : 0*unit },
			{ idx : 1, cn : "木", angle : 1*unit },
			{ idx : 2, cn : "火", angle : 2*unit },
			{ idx : 3, cn : "土", angle : 3*unit },
			{ idx : 4, cn : "金", angle : 4*unit }
		];
	};
	
	function _getE10()
	{//返回十天干常量。
		return [
			{ idx : 0, cn : "甲", e2 : E2[1], e5 : E5[1] },
			{ idx : 1, cn : "乙", e2 : E2[0], e5 : E5[1] },
			{ idx : 2, cn : "丙", e2 : E2[1], e5 : E5[2] },
			{ idx : 3, cn : "丁", e2 : E2[0], e5 : E5[2] },
			{ idx : 4, cn : "戊", e2 : E2[1], e5 : E5[3] },
			{ idx : 5, cn : "己", e2 : E2[0], e5 : E5[3] },
			{ idx : 6, cn : "庚", e2 : E2[1], e5 : E5[4] },
			{ idx : 7, cn : "辛", e2 : E2[0], e5 : E5[4] },
			{ idx : 8, cn : "壬", e2 : E2[1], e5 : E5[0] },
			{ idx : 9, cn : "癸", e2 : E2[0], e5 : E5[0] }
		];
	};

	function _getE12()
	{//返回十二地支常量。
		return [
			{ idx : 0, cn : "子", e2 : E2[1], e5 : E5[0] },
			{ idx : 1, cn : "丑", e2 : E2[0], e5 : E5[3] },
			{ idx : 2, cn : "寅", e2 : E2[1], e5 : E5[1] },
			{ idx : 3, cn : "卯", e2 : E2[0], e5 : E5[1] },
			{ idx : 4, cn : "辰", e2 : E2[1], e5 : E5[3] },
			{ idx : 5, cn : "巳", e2 : E2[0], e5 : E5[2] },
			{ idx : 6, cn : "午", e2 : E2[1], e5 : E5[2] },
			{ idx : 7, cn : "未", e2 : E2[0], e5 : E5[3] },
			{ idx : 8, cn : "申", e2 : E2[1], e5 : E5[4] },
			{ idx : 9, cn : "酉", e2 : E2[0], e5 : E5[4] },
			{ idx : 10, cn : "戌", e2 : E2[1], e5 : E5[3] },
			{ idx : 11, cn : "亥", e2 : E2[0], e5 : E5[0] },
		];
	};
	
	function _getE60()
	{//返回花甲常量。
		var arr = [];
		for(var i = 0; i < 60; i++)
		{
			arr[i] = {};
			arr[i].idx = i;
			arr[i].trunk = E10[i % 10];
			arr[i].branch = E12[i % 12];
			arr[i].cn = E10[i % 10].cn + E12[i % 12].cn;
		}
		return arr;
	};
	
	function _getV10()
	{//返回十神常量。
		return [
			{ idx : 0, cn : "才", cnName : "正财", val : -0.2, des : "我克者为财，异性相克为正财。" },
			{ idx : 1, cn : "财", cnName : "偏财", val : -0.3, des : "我克者为财，同性相克为偏财。" },
			{ idx : 2, cn : "官", cnName : "正官", val : -0.4, des : "克我者为官，异性相克为正官。" },
			{ idx : 3, cn : "杀", cnName : "七杀", val : -0.5, des : "克我者为官，同性相克为偏官，又叫七杀。" },
			{ idx : 4, cn : "伤", cnName : "伤官", val : -0.3, des : "我生者为食伤，异性相生为伤官。" },
			{ idx : 5, cn : "食", cnName : "食神", val : -0.2, des : "我生者为食伤，同性相生为食神。" },
			{ idx : 6, cn : "印", cnName : "正印", val : 0.5, des : "生我者为印绶，异性相生为正印。" },
			{ idx : 7, cn : "枭", cnName : "偏印", val : 0.4, des : "生我者为印绶，同性相生为偏印，又叫枭神。" },
			{ idx : 8, cn : "比", cnName : "比肩", val : 0.2, des : "同我者为比劫，同性帮扶为比肩。" },
			{ idx : 9, cn : "劫", cnName : "劫财", val : 0.3, des : "同我者为比劫，异性帮扶为劫财。" }
		];
	};

	function _getV12()
	{//返回生旺死绝表常量。
		return [
			{ idx : 0, cn : "长生", val : 1 },
			{ idx : 1, cn : "沐浴", val : 1 },
			{ idx : 2, cn : "冠带", val : 1 },
			{ idx : 3, cn : "临官", val : 1 },
			{ idx : 4, cn : "帝旺", val : 1 },
			{ idx : 5, cn : "衰", val : -1 },
			{ idx : 6, cn : "病", val : -1 },
			{ idx : 7, cn : "死", val : -1 },
			{ idx : 8, cn : "墓", val : -1 },
			{ idx : 9, cn : "绝", val : -1 },
			{ idx : 10, cn : "胎", val : -1 },
			{ idx : 11, cn : "养", val : 1 }
		];
	};
	
	function _getE10Position()
	{//返回十神位置权重
		return {
			year : {
				trunk : 0,
				branch : 0
			},
			month : {
				trunk : 1.5,
				branch : 5
			},
			day : {
				trunk : 0,
				branch : 2
			},
			hour : {
				trunk : 1.5,
				branch : 0
			},
		};
	};
})();

